package pe.edu.sisclas.model.dao.impl;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.edu.sisclas.model.dao.IncidenciaDao;
import pe.edu.sisclas.model.dao.exception.DaoException;
import pe.edu.sisclas.model.domain.Incidencia;

@Repository
public class IncidenciaDaoImpl implements IncidenciaDao {

	@Autowired
	private SessionFactory sessionFactory;

	@SuppressWarnings("unchecked")
	@Override
	public List<Incidencia> getAll() throws DaoException {
		try {
			Session session = getSessionFactory().getCurrentSession();
			List<Incidencia> incidencias = session.createQuery(
					"from Incidencia").list();
			return incidencias;
		} catch (Exception e) {
			throw DaoException.mensaje("Error en la base de datos.");
		}
	}

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public void save(Incidencia incidencia) throws DaoException {
		try {
			Session session = getSessionFactory().getCurrentSession();
			session.save(incidencia);
		} catch (Exception e) {
			e.printStackTrace();
			throw DaoException.mensaje("Error al guardar");
		}
	}

	@SuppressWarnings("unchecked")
	public List<Incidencia> getByTitle(String title) throws DaoException {
		try {
			Session session = getSessionFactory().getCurrentSession();
			List<Incidencia> incidencias = session
					.createQuery(
							"from Incidencia i where i.titulo like :titulo")
					.setParameter("titulo", "%" + title + "%").list();
			return incidencias;
		} catch (Exception e) {
			throw DaoException.mensaje("Error en la base de datos.");
		}
	}

	@SuppressWarnings("unchecked")
	public List<Incidencia> getByFields(String numAula, String nombreUsuario,
			String estado, boolean frecuentes, boolean comentados)
			throws DaoException {
		try {
			Session session = getSessionFactory().getCurrentSession();
			List<Incidencia> incidencias = session.createQuery("").list();
			return incidencias;
		} catch (Exception e) {
			throw DaoException.mensaje("Error en la base de datos.");
		}
	}

	@Override
	public void UpdateIncidencia(String titulo, char nuevoEstado)
			throws DaoException {
		try {
			Session session = getSessionFactory().getCurrentSession();
			int i = session.createQuery(
					"Update Incidencia set estado='" + nuevoEstado + "'"
							+ "where titulo='" + titulo + "' ").executeUpdate();
			System.out.println(i);
		} catch (Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
			throw DaoException.mensaje("Error al guardar");
		}

	}

	@SuppressWarnings("unchecked")
	public List<Incidencia> getByFields(Incidencia incidencia,
			boolean frecuentes, boolean comentados) throws DaoException {
		String hql = "select i.* from Incidencia i where "
				+ "(i.aula.numeroAula like :numeroAula or i.laboratorio.numeroLaboratorio like :numeroLaboratorio) and "
				+ "(i.usuario.docente.nombreDocente like :nombreDocente or i.usuario.soporte.nombreDocente like :nombreSoporte) and "
				+ "i.estado = :estado";
		
		if(frecuentes){
			hql+=" order by i.tipo";
		}

		try {
			Session session = getSessionFactory().getCurrentSession();
			List<Incidencia> incidencias = session.createQuery(hql)
					.setParameter("numeroAula", "%"+incidencia.getAula().getNumeroAula()+"%")
					.setParameter("numeroLaboratorio", "%"+incidencia.getAula().getNumeroAula()+"%")
					.setParameter("nombreDocente", "%"+incidencia.getUsuario().getDocente().getNombreDocente()+"%")
					.setParameter("nombreSoporte", "%"+incidencia.getUsuario().getDocente().getNombreDocente()+"%")
					.setParameter("estado", "%"+incidencia.getEstado()+"%").list();
			return incidencias;
		} catch (Exception e) {
			e.printStackTrace();
			throw DaoException.mensaje("Error en la base de datos.");
		}
	}
}
